From f86aaeda1bfae8c5c67bb38b9c274b799969cf3a Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 17 Oct 2014 14:02:16 -0700 Subject: [PATCH] Ignore EPERM when scanning for packages We won't make much progress reporting the error back up the chain, so we may as well carry on! --- src/cargo/ops/cargo_read_manifest.rs | 13 ++++++++++--- tests/test_cargo_compile.rs | 17 ++++++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/cargo/ops/cargo_read_manifest.rs b/src/cargo/ops/cargo_read_manifest.rs index 19615f60e..1b7372682 100644 --- a/src/cargo/ops/cargo_read_manifest.rs +++ b/src/cargo/ops/cargo_read_manifest.rs @@ -1,9 +1,9 @@ use std::collections::HashSet; -use std::io::{File, fs}; +use std::io::{mod, File, fs}; use std::io::fs::PathExtensions; use core::{Package,Manifest,SourceId}; -use util::{mod, CargoResult, human}; +use util::{mod, CargoResult, human, CargoError}; use util::important_paths::find_project_manifest_exact; use util::toml::{Layout, project_layout}; @@ -61,7 +61,14 @@ fn walk(path: &Path, is_root: bool, return Ok(()); } - for dir in try!(fs::readdir(path)).iter() { + // Ignore any permission denied errors because temporary directories + // can often have some weird permissions on them. + let dirs = match fs::readdir(path) { + Ok(dirs) => dirs, + Err(ref e) if e.kind == io::PermissionDenied => return Ok(()), + Err(e) => return Err(e.box_error()), + }; + for dir in dirs.iter() { try!(walk(dir, false, |a, x| callback(a, x))) } } diff --git a/tests/test_cargo_compile.rs b/tests/test_cargo_compile.rs index b0ff9d716..b6077f30f 100644 --- a/tests/test_cargo_compile.rs +++ b/tests/test_cargo_compile.rs @@ -1,4 +1,4 @@ -use std::io::{fs, TempDir, File}; +use std::io::{mod, fs, TempDir, File}; use std::os; use std::path; @@ -1662,3 +1662,18 @@ test!(recompile_space_in_name { assert_that(foo.process(cargo_dir().join("cargo")).arg("build"), execs().with_status(0).with_stdout("")); }) + +test!(ignore_bad_directories { + let foo = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.0" + authors = [] + "#) + .file("src/lib.rs", ""); + foo.build(); + fs::mkdir(&foo.root().join("tmp"), io::USER_EXEC ^ io::USER_EXEC).unwrap(); + assert_that(foo.process(cargo_dir().join("cargo")).arg("build"), + execs().with_status(0)); +}) -- 2.30.2